#ifndef _TASK_GROUP_H_
#define _TASK_GROUP_H_

#include "task.h"
#include <list>

namespace qb
{
	class ITaskGroupObserver
	{
	public:
        virtual void OnTaskStep(qb::NetStatus status, short ret_code) = 0;
		virtual void OnAllTaskFinished() = 0;
		virtual void OnTaskGroupFailed(qb::NetStatus status, short ret_code) = 0;
	};

	class CLoginConnectTask;
	class CLoginVerifyTask;
	class CLoginGwVerifyTask;
    class CLoginAuthorityTask;

    class CTaskGroup 
		: public ITaskObserver
    {
    public:
        CTaskGroup(int nType=0);
        ~CTaskGroup();

    public:
        // 获得正在运行的Task
        CTask* GetCurrentTask() const;

        // 添加一个Task
        void Append(CTask* pTask);

        // task是否已经执行完成
        bool IsAllTaskFinished();

		// 启动登录流程, bNeetRoute:true需要网络寻路, bNeetRoute:false不需要
		int32_t StartLoginSteps();

		// 构造登录步骤
		int32_t BuildLoginSteps();

		// 运行登录步骤
		int32_t RunLoginSteps();

		// 停止登录流程
		void StopLoginSteps();

		// 删除登录任务
		void DeleteTaskGroups();

		bool OnNetData(char* pData, int nDataLen);
		bool OnNetStatus(int32_t status);

        void SetObserver(ITaskGroupObserver* pObserver) { m_listObserver.push_back(pObserver); }

    // ITaskObserver
    protected:
        virtual void OnTaskStep(qb::NetStatus status, short ret_code);
		virtual void OnTaskFinished(CTask* pTask);
		virtual void OnTaskFailed(CTask* pTask, qb::NetStatus status, short ret_code);

    private:
        // 开始下一个任务
        void StartNextTask();

    private:
        std::list<CTask*>               m_tasks;
        int                             m_nCurrentTask;
        int                             m_nTrys;

        CLoginConnectTask*              m_pLoginConnectTask;	// 连接登录服务器
        CLoginVerifyTask*               m_pLoginVerifyTask;		// 账号密码验证
        CLoginConnectTask*              m_pGWConnectTask;		// 连接网关服务器
        CLoginGwVerifyTask*             m_pLoginGwVerifyTask;	// cookie验证
        CLoginAuthorityTask*            m_pLoginAuthorityTask;	// 用户权限请求
        std::list<ITaskGroupObserver*>	m_listObserver;
    };
}

#endif
